package cn.cailin.day07.demo02Recursion;

import java.io.File;

/*
    只要.java文件
    优化
        我们可以使用过滤器实现
        在File类中有俩个和ListFile重载的方法，方法的参数传递的就是过滤器
        File[] ListFile（FileFilter filter)
        java.io.FileFilter接口:用于抽象路径名（File 对象）的过滤器。
            作用:用来过滤文件（File对象）
            抽象方法：用来过滤文件的方法
                boolean accept(File pathname)测试指定抽象路径名是否应该包含在某个路径名列表中
                参数：
                    File pathname:使用ListFiles方法遍历目录，得到的每一个文件对象
        File[] ListFile（FileFilter filter)
        java.io.FilenameFilter接口:用于抽象路径名（File 对象）的过滤器。
            作用：用于过滤文件名称
            抽象方法：用来过滤文件的方法
                boolean accept(File dir,String name)测试指定文件是否应该包含在某一个文件列表中
                参数：
                    File dir:构造方法中传递的被遍历的目录
                    String name:使用ListFile方法遍历目录，获取的每一个文件文件夹的名称
                注意：
                    俩个过滤器接口是没有实现类的，需要我们自己写实现类，重写过滤方法accept，在方法中自己定义过滤规则


 */
public class Demo06Recursion {

        public static void main(String[] args) {
            File file = new File("d:\\IDEA");
            getAllFile(file);
        }

        public static void getAllFile(File dir) {
            //   System.out.println(dir);//先打印呗遍历的目录名称
            File[] files = dir.listFiles(new FileFilterImpl());
            for (File f : files) {
                //对遍历得到的File对象f进行判断，判断是否是文件夹
                if (f.isDirectory()) {
                /*
                    f是一个文件夹，则继续遍历这个文件夹
                    我们发现getAllFile方法就是传递文件夹，遍历文件夹的方法
                    所有之间调用getAllFile方法即可：递归（自己调用自己)
                 */
                    getAllFile(f);
                } else {
                    if (f.getName().toLowerCase().endsWith(".java")) {
                        System.out.println(f);
                    }

                }
            }
        }

}
